#include "Socket.hpp"
#include <iostream>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace SocketModule;
using namespace LogModule;

using ioservice_t = std::function<void(std::shared_ptr<Socket> &sock, InetAddr &client)>;

// 网络版本的计算器，长服务
class TcpServer
{
public:
    TcpServer(uint16_t port)
        : _port(port),
          _listensockfd(std::make_unique<TcpSocket>()),
          _isrunning(false)
    {
        _listensockfd->BuildTcpSocketMethod(_port);
    }

    void Start(ioservice_t callback)
    {
        // 已经是运行状态
        _isrunning = true;
        while (_isrunning)
        {
            InetAddr client;
            // 1. 和client通信的sockfd --- tcp与client通信， listen + accept
            // 2. client 网络地址
            // 功能已经接口化,
            auto sockfd = _listensockfd->AcceptOrDie(&client);
            if (sockfd == nullptr)
            {
                continue;
            }

            // sock && client
            // 进程版本的 接收与应答
            pid_t id = fork();
            if (id < 0)
            {
                LOG(LogLevel::FATAL) << "fork error ...";
                exit(FORK_ERR);
            }
            else if (id == 0)
            {
                // 子进程 -> 不需要 listen 状态
                _listensockfd->Close();
                if (fork() > 0)
                {
                    exit(OK);
                }
                //_service(sockfd, client);
                callback(sockfd, client);
                sockfd->Close();
                exit(OK);
            }
            else if (id > 0)
            {
                // 父进程 不需要 sockfd
                sockfd->Close();
                pid_t rid = waitpid(id, nullptr, 0);
                (void)rid;
            }
        }
        _isrunning = false;
    }

    ~TcpServer()
    {
    }

private:
    // tcp网络通信三要素 ，是否运行 ，路由功能
    uint16_t _port;
    std::unique_ptr<Socket> _listensockfd;
    bool _isrunning;

   // ioservice_t _service;
};

